package com.platform.utils;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.sf.json.JSONObject;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import org.apache.commons.codec.binary.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

/**
 * 功能:		web.cr6868.com HTTP接口 发送短信
 * 说明:		http://web.cr6868.com/asmx/smsservice.aspx?name=登录名&pwd=接口密码&mobile=手机号码&content=内容&sign=签名&stime=发送时间&type=pt&extno=自定义扩展码
 *
 * @author lipengjun
 * @date 2017年11月18日 下午13:13:23
 */
public class SmsUtil {

    private static Logger logger = LoggerFactory.getLogger(SmsUtil.class);

    //    private static String baseUrl = "http://47.92.155.109:9502/";
//    public static final String acount= "credit";
//    public static final String secret = "660cb6fe7437d4b40e4a04b706b93f70";
    private static String baseUrl = ResourceUtil.getConfigByName("sms.baseUrl");
    public static final String acount = ResourceUtil.getConfigByName("sms.account");
    public static final String secret = ResourceUtil.getConfigByName("sms.secret");


    private static Retrofit retrofitCaptcha = new Retrofit.Builder()
            .baseUrl(baseUrl)
            .addConverterFactory(GsonConverterFactory.create(genericGson()))
            .client(genericClient())
            .build();

    private static Gson genericGson(){
        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                .create();
        return gson;
    }

    public static OkHttpClient genericClient() {
        OkHttpClient httpClient = new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
                    @Override
                    public okhttp3.Response intercept(Chain chain) throws IOException {
                        Request request = chain.request()
                                .newBuilder()
                                .addHeader(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8")
                                .addHeader(HttpHeaders.AUTHORIZATION, getHeaderAuthorization())
                                //.addHeader("Accept-Encoding", "gzip, deflate")
                                //.addHeader("Connection", "keep-alive")
                                //.addHeader("Accept", "*/*")
                                //.addHeader("Cookie", "add cookies here")
                                .build();
                        return chain.proceed(request);
                    }
                }).build();
        return httpClient;
    }


    public static String getHeaderAuthorization() {
        String token = org.apache.commons.codec.binary.Base64.encodeBase64String((acount + ":" + secret).getBytes());
        String headerAuthorization = "Basic " + token;
        return headerAuthorization;
    }

    /**
     * 发送验证码
     * @param mobileNo
     * @return
     */
    public static RunResult deliver(String mobileNo){
        SmsService captachService = retrofitCaptcha.create(SmsService.class);
        Response response = null;
        Call<JSONObject> call = captachService.captchaDeliver(mobileNo);
        try {
            response = call.execute();
            if (response != null && response.body() != null){
                return RunResult.ok(response.body());
            } else {
                //接口异常，可能是404
                if (response == null){
                    return RunResult.fail(HttpStatus.BAD_REQUEST, "response is null");
                }
                if (response.errorBody() != null){
                    return RunResult.fail(HttpStatus.BAD_REQUEST, response.errorBody().string());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            //接口异常，500之类，无法解析json
            return RunResult.fail(HttpStatus.BAD_REQUEST, e.getMessage());
        }
        return RunResult.fail(HttpStatus.BAD_REQUEST);
    }


    /**
     * 验证验证码
     * @param mobileNo
     * @param captcha
     * @return
     */
    public static RunResult  verify(String mobileNo,String captcha){
        SmsService captachService = retrofitCaptcha.create(SmsService.class);
        Response response = null;
        Call<JSONObject> call = captachService.verify(mobileNo,captcha);
        try {
            response = call.execute();
            if (response != null && response.body() != null){
                return RunResult.ok(response.body());
            } else {
                //接口异常，可能是404
                if (response == null){
                    return RunResult.fail(HttpStatus.BAD_REQUEST, "response is null");
                }
                if (response.errorBody() != null){
                    return RunResult.fail(HttpStatus.BAD_REQUEST, response.errorBody().string());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            //接口异常，500之类，无法解析json
            return RunResult.fail(HttpStatus.BAD_REQUEST, e.getMessage());
        }
        return RunResult.fail(HttpStatus.BAD_REQUEST);
    }



    /**
     * 发送内容
     * @param mobileNo
     * @return
     */
    public static RunResult deliver(String mobileNo, String content){
        SmsService captachService = retrofitCaptcha.create(SmsService.class);
        Response response = null;
        Call<JSONObject> call = captachService.deliver(mobileNo, content);
        try {
            response = call.execute();
            if (response != null && response.body() != null){
                return RunResult.ok(response.body());
            } else {
                //接口异常，可能是404
                if (response == null){
                    return RunResult.fail(HttpStatus.BAD_REQUEST, "response is null");
                }
                if (response.errorBody() != null){
                    return RunResult.fail(HttpStatus.BAD_REQUEST, response.errorBody().string());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            //接口异常，500之类，无法解析json
            return RunResult.fail(HttpStatus.BAD_REQUEST, e.getMessage());
        }
        return RunResult.fail(HttpStatus.BAD_REQUEST);
    }



    public static RunResult deliverByTemplate(String templateCode, String mobileNo, Object param){
        return null;
    }

    private interface SmsService {

        @GET("/v1/captcha/deliver")
        Call<JSONObject> captchaDeliver(@retrofit2.http.Query("mobileNo") String mobileNo);

        @GET("/v1/captcha/verify")
        Call<JSONObject> verify(@retrofit2.http.Query("mobileNo") String mobileNo, @retrofit2.http.Query("captcha")String captcha);

        @POST("/v1/deliver")
        @FormUrlEncoded
        Call<JSONObject> deliver(@Field("mobileNo") String mobileNo, @Field("content")String content);

        @POST("/v1/sendEmail")
        Call<JSONObject> sendEmail(@Body okhttp3.RequestBody parameter);
    }




























    /**
     * 创锐平台发送短信
     *
     * @param name          用户名
     * @param pwd           密码(md5加密)
     * @param mobileString  电话号码字符串，中间用英文逗号间隔
     * @param contextString 内容字符串
     * @param sign          签名
     * @param stime         追加发送时间，可为空，为空为及时发送
     * @param extno         扩展码，必须为数字 可为空
     * @return
     * @throws Exception
     */
    public static String crSendSms(String name, String pwd, String mobileString, String contextString, String sign, String stime, String extno) throws Exception {
        StringBuffer param = new StringBuffer();
        param.append("name=" + name);
        param.append("&pwd=" + pwd);
        param.append("&mobile=").append(mobileString);
        param.append("&content=").append(URLEncoder.encode(contextString, "UTF-8"));
        if (StringUtils.isNotEmpty(stime)) {
            param.append("&stime=" + stime);
        }
        param.append("&sign=").append(URLEncoder.encode(sign, "UTF-8"));
        param.append("&type=pt");
        if (StringUtils.isNotEmpty(extno)) {
            param.append("&extno=").append(extno);
        }

        URL localURL = new URL("http://web.cr6868.com/asmx/smsservice.aspx?");
        URLConnection connection = localURL.openConnection();
        HttpURLConnection httpURLConnection = (HttpURLConnection) connection;

        httpURLConnection.setDoOutput(true);
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
        httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        httpURLConnection.setRequestProperty("Content-Length", String.valueOf(param.length()));

        OutputStream outputStream = null;
        OutputStreamWriter outputStreamWriter = null;
        InputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader reader = null;
        String resultBuffer = "";

        try {
            outputStream = httpURLConnection.getOutputStream();
            outputStreamWriter = new OutputStreamWriter(outputStream);

            outputStreamWriter.write(param.toString());
            outputStreamWriter.flush();

            if (httpURLConnection.getResponseCode() >= 300) {
                throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
            }

            inputStream = httpURLConnection.getInputStream();
            resultBuffer = convertStreamToString(inputStream);

        } finally {

            if (outputStreamWriter != null) {
                outputStreamWriter.close();
            }

            if (outputStream != null) {
                outputStream.close();
            }

            if (reader != null) {
                reader.close();
            }

            if (inputStreamReader != null) {
                inputStreamReader.close();
            }

            if (inputStream != null) {
                inputStream.close();
            }

        }

        return resultBuffer;
    }


    /**
     * 转换返回值类型为UTF-8格式.
     *
     * @param is
     * @return
     */
    public static String convertStreamToString(InputStream is) {
        StringBuilder sb1 = new StringBuilder();
        byte[] bytes = new byte[4096];
        int size = 0;

        try {
            while ((size = is.read(bytes)) > 0) {
                String str = new String(bytes, 0, size, "UTF-8");
                sb1.append(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb1.toString();
    }


}
